package cn.tedu.sp06.filter;

import cn.tedu.web.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;


import javax.servlet.http.HttpServletRequest;

/**
 * @author 金帮嘉诚 @date 2021-09-13 星期一 9:24
 * 知识点:
 * 过滤器分为前置pre 路由router 后置post 等几种
 */

/**
 * @Author 金帮嘉诚
 * @Date 2021/9/13 9:33
 * 本类用于: 网关权限过滤器,避免在每个服务都要写权限判断
 */
@Component
public class AccessFilter extends ZuulFilter {
    /**
     * @param
     * @return
     * @Author 金帮嘉诚
     * @Date 2021/9/13 9:31
     * 业务需求: 过滤器类型
     */
    @Override
    public String filterType() {
//        return "pre";
        return FilterConstants.PRE_TYPE;
    }

    /**
     * @param
     * @return order
     * @Author 金帮嘉诚
     * @Date 221/9/13 9:27
     * 业务需求: 指定过滤器顺序号
     */

    @Override
    public int filterOrder() {
        // 有五个默认过滤器, 自己的过滤器加到末尾
        // 在第5个过滤器中, 向Context对象放入了 serviceId
        // 后面组件中, 才能访问这个数据
        return 6;
    }

    /**
     * @param
     * @return a
     * @Author 金帮嘉诚
     * @Date 221/9/13 9:28
     * 业务需求: 针对当前请求, 判断是否要执行过滤代码
     * 测试:针对商品服务item-service,检查是否登录
     */
    @Override
    public boolean shouldFilter() {
        // 先获取当前请求的上下文对象
        RequestContext context = RequestContext.getCurrentContext();
        // 当前请求, 调用的服务id
        String serviceId = (String)
                context.get(FilterConstants.SERVICE_ID_KEY);// "serviceId",获取当前请求的服务的id
        // 调用的是否是item-service
        return "item-service".equals(serviceId);
    }

    /**
     * @param
     * @return
     * @Author 金帮嘉诚
     * @Date 2021/9/13 9:31
     * 业务需求:过滤代码
     */
    @Override
    public Object run() throws ZuulException {
        // 获得上下文对象
        RequestContext context = RequestContext.getCurrentContext();
        // 获得 request 对象
        HttpServletRequest request = context.getRequest();
        // url...
        // 接受token参数
        String token = request.getParameter("token");
        // 如果没有token 阻止继续调用 直接返回响应
        // "" null "      "
        if (StringUtils.isBlank(token)) {
            // 阻止继续调用
            context.setSendZuulResponse(false);
            // 直接返回响应
            // JsonResult --- {code:1, msg: xxx, data:null}
            context.addZuulResponseHeader(
                    "Content-Type", "application/json;charset=UTF-8"
            );
            context.setResponseBody(JsonResult
                    .err()
                    .code(400)
                    .msg("您还没有登录!Not Login!")
                    .toString());
        }
        return "返回啥都行";// 当前zuul版本中, 这个返回值没有使用
    }
}
